﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Belmost4PDA.CommonForms;

namespace Belmost4PDA.Logic
{
    public class StateRecordDef:StateRecord
    {
        public StateRecordDef(int id, string text, int panel)
            : base(id, text, panel)
        {
            
        }
        private static Form _form = null;
        public override void RunState(Form form)
        {
            _form = form;
            MainMenu menu = new MainMenu();
            MenuItem quit = new MenuItem();
            quit.Text = "Назад";
            MenuItem m1 = new MenuItem();
            m1.Click += quit_Click;
            m1.Text = "Выход с сохранением";
            quit.MenuItems.Add(m1);
            m1 = new MenuItem();
            m1.Click += quit_Click_NoPost;
            m1.Text = "Выход без сохранения";
            quit.MenuItems.Add(m1);
            menu.MenuItems.Add(quit);
            menu.MenuItems.Add(GetElemTree());

            form.Menu = menu;
        }
        private readonly Dictionary<MenuItem, brElement> mapMenu = new Dictionary<MenuItem, brElement>();
        private MenuItem GetElemTree()
        {
            /// загружает элементы
            /// переводит дерево в структуру меню и подменю. 
            /// так как у MenuItem нет Tag то свзяь сохраняеться в mapMenu
            /// для каждого MenuItem устанавливает обработчик Click в item_Click
            brElement tree = brElement.GetTree();
            MenuItem mitem = new MenuItem(); // это надо на случай если ктото (злоумышленик :) ) удалил все элементы у моста
            mitem.Text = "Элементы";
            if (tree.Child.Count != 0)
            {
                    LoadChild(mitem, tree.Child[0].Child[0],false);   
            }
            return mitem;
        }
        private void LoadChild(Menu parent, brElement brelem, bool choose)
        {
            MenuItem item=new MenuItem();
            if (brelem.Child.Count > 0 && choose)
            {
                item.Text = "Выбрать";
                item.Click += item_Click;
                mapMenu.Add(item, brelem);
                parent.MenuItems.Add(item);
            }
            foreach (brElement elem in brelem.Child)
            {
                item = new MenuItem();
                item.Text = elem.Name;
                item.Click += item_Click;
                mapMenu.Add(item,elem);
                parent.MenuItems.Add(item);
                LoadChild(item, elem,true);
            }
        }
        void quit_Click(object sender, EventArgs e)
        {
            // test value for good value
            bool NoPost = false;
            MenuItem clickItem = null;
            string exmessage="";
            foreach (KeyValuePair<MenuItem, brElement> pair in mapMenu)
            {
                try{/*if(!*/pair.Value.TestValue();//)
                
                    //NoPost = true;
                    //clickItem = pair.Key;
                }//}
                catch(ExceptionClass ex)
                {
                    NoPost = true;
                    exmessage=ex.Message;
                    clickItem = pair.Key;
                    //break;
                }
            }            
            if(NoPost)
            {
                MessageBox.Show(exmessage);
                item_Click(clickItem, null);
                return;
            }
            foreach (KeyValuePair<MenuItem, brElement> pair in mapMenu)
            {
                pair.Value.PostData();
            }
            StateDispatcher disp = StateDispatcher.GetDispatcher();
            disp.QuitFromState(); 
        }

        static void quit_Click_NoPost(object sender, EventArgs e)
        {
            if (new Dialogs().CommitCancel())
            {
                StateDispatcher disp = StateDispatcher.GetDispatcher();
                disp.QuitFromState();
            }
        }
        void item_Click(object sender, EventArgs e)
        {
            if(mapMenu.ContainsKey((MenuItem)sender))
            {
                _form.Controls.Clear(); // это надо сделать именно сдесь так как потом могут захотеть выводить дефкты и для дочерних элементов
                _form.Tag = 0; // для правильного формрования смещения контролов
                mapMenu[(MenuItem) sender].CreateDefWindow(_form);
            }
        }
    }
}
